﻿using System;
using System.Data;
using System.Windows.Forms;
using System.Collections.Generic;

namespace GUI
{
    /// <summary>
    /// Form principale de l'application
    /// Permet de Ajouter/Modifier/Supprimer les catégories et les produits (via les Forms CategoryEditForm et ProductEditForm)
    /// </summary>
    public partial class MainForm : Form
    {
        private DataSet ds;

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            PopulateAndBind();
        }

        /// <summary>
        /// Déclenché au chargement de la Form
        /// Mise en place des liaisons des données
        /// </summary>
        private void PopulateAndBind()
        {
            ds = new DataSet();

            //Récuperation des catégories dans la db
            DataTable categoryDT = new DataTable();
            categoryDT = BU.CategoryManager.Fetch();
            ds.Tables.Add(categoryDT);

            //Récuperation des produits dans la db
            DataTable productDT = new DataTable();
            productDT = BU.ProductManager.Fetch();
            ds.Tables.Add(productDT);

            // Création de la laison de données entre les catégories et les produits
            DataColumn parentColumn = ds.Tables["category"].Columns["categoryid"];
            DataColumn childColumn = ds.Tables["product"].Columns["categoryid"];
            ds.Relations.Add("category_product", parentColumn, childColumn);

            cboCategory.DataSource = ds;
            cboCategory.ValueMember = "category.categoryid";
            cboCategory.DisplayMember = "category.name";

            txtCategoryID.DataBindings.Add("Text", ds, "category.categoryid");
            txtDescription.DataBindings.Add("Text", ds, "category.description");

            dgvProduct.DataSource = ds;
            dgvProduct.DataMember = "category.category_product";
        }

// actions sur les catégories

        /// <summary>
        /// Ouvre un CategoryEditForm permetant la mise à jour des données relatives à la catégorie courante
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnCategoryEdit_Click(object sender, EventArgs e)
        {
            CurrencyManager cm = (CurrencyManager)this.BindingContext[ds, "category"];

            CategoryEditForm categoryEditForm = new CategoryEditForm(cm);

            if (categoryEditForm.ShowDialog() == DialogResult.OK && ds.HasChanges())
                BU.CategoryManager.Update(ds.Tables["category"]);
        }

        /// <summary>
        /// Ouvre un CategoryEditForm permetant la création d'une nouvelle catégorie
        /// </summary>
        /// <param name="sender">(object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnCategoryAdd_Click(object sender, EventArgs e)
        {
            CurrencyManager cm = (CurrencyManager)this.BindingContext[ds, "category"];
            cm.AddNew();

            CategoryEditForm categoryEditForm = new CategoryEditForm(cm);

            if (categoryEditForm.ShowDialog() == DialogResult.OK && ds.HasChanges())
                BU.CategoryManager.Insert(ds.Tables["category"]);
        }

        /// <summary>
        /// Permet la supression de la catégorie courante
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnCategoryDelete_Click(object sender, EventArgs e)
        {
                CurrencyManager cmCategory = (CurrencyManager)this.BindingContext[ds, "category"];
                DataRowView categoryDV = (DataRowView)cmCategory.Current;

                CurrencyManager cmProduct = (CurrencyManager)this.BindingContext[ds, "category.category_product"];

                if (MessageBox.Show("Êtes-vous sûr de vouloir supprimer définitivement cette catégorie ? Tous les produits qui lui sont liés seront supprimés également.", "Suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    categoryDV.Row.Delete();
                    BU.CategoryManager.Delete(ds.Tables["category"]);
                }
        }

//fin des actions sur les catégories

//actions sur les produits

        /// <summary>
        /// Ouvre un ProductEditForm permetant la création d'un nouveau produit
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnProductAdd_Click(object sender, EventArgs e)
        {
            CurrencyManager cm = (CurrencyManager)this.BindingContext[ds, "category.category_product"];
            cm.AddNew();

            ProductEditForm productEditForm = new ProductEditForm(cm,ds);

            if (productEditForm.ShowDialog() == DialogResult.OK && ds.HasChanges())
            {
                BU.ProductManager.Insert(ds.Tables["product"]);
            }

        }

        /// <summary>
        /// Ouvre un ProductEditForm permetant la modification des données d'un produit
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnProductEdit_Click(object sender, EventArgs e)
        {
            CurrencyManager cm = (CurrencyManager)this.BindingContext[ds,"category.category_product"];

            ProductEditForm productEditForm = new ProductEditForm(cm,ds);

            if (productEditForm.ShowDialog() == DialogResult.OK && ds.HasChanges())
            {
                BU.ProductManager.Update(ds.Tables["product"]);
            }
        }

        /// <summary>
        /// Permet la supression du produit courant
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnProductDelete_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Êtes-vous sûr de vouloir supprimer définitivement ce produit ?", "Suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                CurrencyManager cm = (CurrencyManager)this.BindingContext[ds, "category.category_product"];
                DataRowView productDV = (DataRowView)cm.Current;

                productDV.Row.Delete();

                BU.ProductManager.Delete(ds.Tables["Product"]);
            }
        }

//fin des actions sur les produits
    }
}